package theUseOfArrays;

import java.util.Arrays;

/**
 * @ClassName TraverseTheArray
 * @Description 遍历数组
 * @Author 李明忠
 * @Date 2025/5/24 17:31
 * @Version 1.0
 */
@SuppressWarnings("all")
public class TraverseTheArray {
    /**
     * 数组遍历方式1：使用for循环
     * @param arr
     */
    public static void fun1(int[] arr) {
        /*
        * 注意：i < arr.length
        * arr.length 数组是一个特殊的对象，它里面有一个属性length用于存放当前数组的长度
        * */
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        //结果：10 20 30 40 50
    }

    /**
     * 数组遍历方式2：使用增强foreach
     * @param arr
     */
    public static void fun2(int[] arr) {
        /*
        * 语法说明：
        *   for(定义一个临时变量 : 数组名) {}
        *   1）临时变量的数据类型需要与数组中容器的元素类型一致。
        *   2）需要注意的是括号中的格式是：
        *       (与你容器中元素相匹配变量  :  容器)
        * */
        for ( int tmp : arr) {
            System.out.print(tmp + " ");
        }
        //结果：10 20 30 40 50

        /*
        * 易错写法：
        *   int tmp;
        *   for (tmp : arr) {  // 编译错误！
        *       System.out.println(tmp);
        *   }
        *
        *   for-each 循环的语法要求循环变量必须在循环内部声明，而不能使用外部预先定义的变量。
        * 为什么 Java 不允许第一种写法？
        *
        *   语义清晰性：for-each 循环的设计初衷是让代码更简洁，避免手动管理索引或迭代器。
        * 如果允许外部变量，可能会引起误解（比如误以为可以手动控制赋值）。
        *
        *   作用域控制：for-each 的循环变量应该是临时的，仅在循环内部有效，避免变量泄露到外部作用域。
        *
        *   语言规范限制：Java 语法明确规定 for (Type var : iterable) 必须声明新变量，不能复用外部变量。
        *
        * */
    }

    /**
     * 数组遍历方式3：使用工具类Arrays.toString(数组名)
     * @param arr
     */
    public static void fun3(int[] arr) {
        //将数组arr转为字符串的形式输出
        System.out.println(Arrays.toString(arr));
        //结果：[10, 20, 30, 40, 50]
    }

    public static void main(String[] args) {
        int[] array = {10, 20, 30, 40, 50};
        //ArrayIndexOutOfBoundsException
        //遍历方式1
        fun1(array);
        //遍历方式2
        fun2(array);
        //遍历方式3
        fun3(array);
    }
}
